<?php
// 商品类
namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Session;
use App\Http\Controllers\Admin\CategoryController;

class ComController extends Controller
{
	
	// 后台 商品列表页
	public function index(Request $request)
	{
		// 获取搜索关键字
		$keyword = $request->input('keyword',"");
		if( empty($keyword) )
		{
			// 为空 说明没有搜索
			$one = 'c.id';
			$two = '!=';
			$three = '0';
		}else
		{
			// 商品名称 
			$one = 'c.name';
			$two = 'like';
			$three = '%'.$keyword.'%';
		}
		// 查询所有商品 每页10条数据
		$coms = DB::table('com as c') 
				->select('c.id','c.name','c.category_id','c.inPrice','c.price','c.stock','c.status','c.admin_id','cp.pic_url','ca.name as category_name','a.name as admin_name',DB::raw("case when c.status=1 then '上架' when c.status=2 then '下架' when c.status=3 then '已推荐' when c.status=4 then '无库存' end as comStatus"),'c.allStock' )
				->leftJoin('com_pic as cp','cp.sku','=','c.id')
				->leftJoin('category as ca','ca.id','=','c.category_id')
				->leftJoin('admin as a','a.id','=','c.admin_id')
				->where( $one,$two,$three ) 
				// 只要主图
				-> where( 'cp.type','=','1' ) 
				->orderBy('id','desc')
				->paginate(10);
		return view( 'Admin.com.list',[ 'coms'=>$coms,'request'=>$keyword ] );
	}
	
	// 执行 修改商品状态
	public function upStatus($id,Request $request)
	{
		// 只能操作 上架 下架 已推荐 
		$status = array( 1=>'上架',2=>'下架',3=>'已推荐',4=>'无库存');
		$data = $request -> except('_token');
        $res = DB::table('com')
					// 商品ID
					->where('id',$id)
					->update($data);
		if($res)
		{
			$info = $this::getComById( $id );
			/*
			* 	写日志 
			* 	参数：$type		类型 1是前台用户 2是商品 3是订单 4是员工管理
			*		  $link_id	关联表的ID
			*		  $content	操作说明
			*/
			$this -> write_log(2,$id,'商品 ['.$id.'] '.$info->name.' 更改为 '.$status[$data['status']]);
			// 修改成功
			return 1;
		}else
		{
			return 0;
		}
	}
	
	// 用于 商品 编辑
	// 用于 分类 编辑
	// 获取商品的所有分类层级
	public static function getPath( $category_id='' ){
		// 分类信息
		$category_info = DB::table('category')
					->where( 'id','=',$category_id )
					->first();
		// 拼一个完整的path
		$category_info->path .=$category_id;
		// 转换成数组
		$category_arr=explode( '-',$category_info->path );
		// 清除无效值
		unset( $category_arr[0] );	
		$arr = array();
		foreach( $category_arr as $key=>$category_id )
		{
			$category_info = DB::table('category')->where( 'id','=',$category_id )->first();
			// 分类的 id 与 分类名
			$arr[$key]['category_name'] = $category_info->name;
			$arr[$key]['id'] = $category_info->id;
		}
		return $arr;
	}
	
	
	// 商品创建 编辑页面
	public function create( $id='' )
	{
		// 获取所有一级分类
		$all_first_category = CategoryController::getFirstAll();
		if( $id )
		{
			// 主表 所有内容
			$com_info = $this::getComById($id);
			// 图片表 所有内容
			$pic_info = $this::getComPicById($id);
			// 商品分类内容
			$category_path = $this::getPath( $com_info->category_id );
			// 编辑页面
			return view("Admin.com.add",['all_first_category'=>$all_first_category,'com_info'=>$com_info,'pic_info'=>$pic_info,'category_path'=>$category_path ] );
			
		}else
		{
			// 创建页面
			return view("Admin.com.add",['all_first_category'=>$all_first_category]);
		}
		
	}
	
	// 获取商品主表内容
    public static function getComById( $id )
	{
		// 商品主表内容
		$com_info = DB::table('com as c')
				->where('c.id','=',$id)
				->first();
		return $com_info;
	}
	
	// 获取商品图片表内容
    public static function getComPicById( $id )
	{
		// 图片表内容
		$pic_info = DB::table('com_pic as cp')
				->where('cp.sku','=',$id)
				->get();
		return $pic_info;
		
	}
	
	
	// 上传 商品 图片
	public function uploadComPic( $Files )
	{
		// 时间戳 作为新建目录名
		$time = time();
		// 目标目录 定义公共目录
		$dir= public_path('images')."/coms/".$time;
		// 检测 文件 或者 目录 是否存在
		if( !file_exists($dir) )
		{	
			// 创建 目录
			mkdir( $dir,0777,true );
		}
		$filename_arr = array();
		foreach( $Files as $key => $file_info )
		{
			// 文件名
			$fileName = $file_info['name'];
			// 后缀
			$ext = pathinfo( $fileName,PATHINFO_EXTENSION );
			// 临时目录
			$srcDir = $file_info['tmp_name'];
			// 新的 文件名
			$newName = rand(1,1000000).".".$ext;
			// 移动成功
			$res = move_uploaded_file( $srcDir, $dir."/".$newName );
			$filename_arr[]=$time."/".$newName;
		}
		
		// 返回文件路径 12242/2.jpg
		return $filename_arr;
		
	}
	
	
	// 执行商品创建/编辑
	public function doCreate( $id='',Request $request)
	{
		$data = array();
		$data = $request -> only('name','inPrice','price','stock','description','category');
		
		// 验证 
		// 判断分类 
		// 分类 转成数组
		$data['category'] = explode(',',$data['category']);
		// 清除无效值
		unset($data['category'][0]);
		// 0代表没有选择任何一个分类		
		if( $data['category'][1]=='0' )
		{			
			$this->show_msg( '请选择商品分类' );
		}else
		{
			foreach( $data['category'] as $key=>$category_id ){
				if( $category_id!='-1' ){
					// 最后一次为 父类id
					$data['category_id']=$category_id;
				}
			}
		}
		
		$name_length=mb_strlen( $data['name'],'utf-8' );
		if( $name_length<1 )
		{
			$this->show_msg('商品名称不能为空');
		}
		if( $name_length>15 )
		{
			$this->show_msg('商品名称字数被限制在15个字符内');
		}

		if( empty($id) )
		{
			// 创建商品
			if( empty($data['inPrice']) )
			{
				$this->show_msg( '请输入成本价' );
			}
			if( empty($data['price']) )
			{
				$this->show_msg( '请输入售价' );
			}
			
			if( empty($data['stock']) )
			{
				$this->show_msg( '请输入库存' );
			}
		}
		
		if( empty($data['description']) )
		{
			$this->show_msg( '请输入描述' );
		}
		
		if( $id )
		{
			// 编辑 只能修改 分类 商品名称 图片 描述
			unset($data['category'],$data['inPrice'],$data['price'],$data['stock']);
			// 1. 主表
			$upd_res = DB::table('com')->where( 'id','=',$id )->update($data);
			if( $upd_res )
			{
				// 上传了新图
				if( !empty( $_FILES ) )
				{
					// 2. 删除 磁盘旧图
					$pic_info = DB::table('com_pic')->where('sku','=',$id)->first();
					$pic = explode('/',$pic_info->pic_url);
					$dir = public_path('images')."/coms/".$pic[0];
					// 目录存在
					if( file_exists($dir) )
					{
						// 打开 目录
						$resource=opendir( $dir );
						// 读取文件夹资源
						while( $file=readdir( $resource ) )
						{	
							// 筛掉 . 和 ..					
							if( $file=='.' || $file=='..' )
							{				
								continue;
							}
							// 删除 文件
							unlink( $dir."/".$file );					
							
						}
						// 删除 空文件夹
						rmdir($dir);
						// 关闭 资源
						closedir( $resource );	
					}
					// 删除 表数据
					DB::table('com_pic')->where('sku','=',$id)->delete();
					
					// 上传 商品图片 返回 文件的存放路径
					$filename_arr = $this -> uploadComPic( $_FILES );
					foreach( $filename_arr as $key => $file_path )
					{
						$data = array();
						$data['sku']=$id;
						$data['pic_url']=$file_path;
						if( $key==0 )
						{
							// 第一张设置为商品主图
							$data['type']=1;
						}else
						{
							// 2辅图
							$data['type']=2;
						}
						// 3. 图片表
						DB::table('com_pic')->insertGetId($data);
					}
				}
				// 否则 没有修改 图片
			}else
			{
				$this->show_msg( '主表信息无修改' );
			}
			$info = $this::getComById( $id );
			/*
			* 	写日志 
			* 	参数：$type		类型 1是前台用户 2是商品 3是订单 4是员工管理
			*		  $link_id	关联表的ID
			*		  $content	操作说明
			*/
			$this -> write_log(2,$id,'编辑商品 ['.$id.'] '.$info->name);
			$this->show_msg( '商品编辑成功' );
		}else
		{
			// 创建
			// 检测图片
			if( !empty( $_FILES ) )
			{
				// 上传 商品图片 返回 文件的存放路径
				$filename_arr = $this -> uploadComPic( $_FILES );
			}else{
				$this->show_msg( '请上传商品图片' );
			}
			unset($data['category']);
			$data['admin_id']=Session::get('admin_id');
			$data['create_time']=date('Y-m-d H:i:s',time());
			// 默认 上架
			$data['status']=1;
			$data['allStock']=$data['stock'];

			// 1. 主表
			$insert_id = DB::table('com')->insertGetId($data);
			if( $insert_id )
			{
				foreach( $filename_arr as $key => $file_path )
				{
					$data = array();
					$data['sku'] = $insert_id;
					$data['pic_url'] = $file_path;
					if( $key==0 )
					{
						// 第一张设置为商品主图
						$data['type']=1;
					}else
					{
						// 2辅图
						$data['type']=2;
					}
					// 2. 图片表
					DB::table('com_pic')->insertGetId($data);
				}
			}else
			{
				$this->show_msg( '操作失败' );
			}
			/*
			* 	写日志 
			* 	参数：$type		类型 1是前台用户 2是商品 3是订单 4是员工管理
			*		  $link_id	关联表的ID
			*		  $content	操作说明
			*/
			$this -> write_log(2,$insert_id,'添加商品 ['.$insert_id.'] '.$data['name']);
			$this->show_msg( '商品创建成功' );
		}
		
	}
	
	// 商品 补充库存
	public function addStock( $com_id,Request $request )
	{
		$final = array();
		// 接收 补充库存
		$data = $request -> except('_token');
		// 1. 获取商品 剩余库存 与 累积库存
		$com_info = DB::table('com')
						->select('stock','allStock')
						->where('id',$com_id)
						->first();
		// 原本的 剩余库存
		$final['stock'] = $com_info->stock ;
		// 追加后 剩余库存
		$final['stock'] += $data['stock'] ;
		if( $final['stock'] > 0 )
		{
			// 上架
			$final['status'] = 1;
		}else
		{
			// 无库存
			$final['status'] = 4;
		}
		
		// 累积库存
		$final['allStock'] = $com_info->allStock;
		$final['allStock'] += $data['stock'] ;
		
		
		// 2. 执行 补充库存
        $res = DB::table('com')
						->where( 'id',$com_id )
						->update( $final );
		if($res)
		{
			/*
			* 	写日志 
			* 	参数：$type		类型 1是前台用户 2是商品 3是订单 4是员工管理
			*		  $link_id	关联表的ID
			*		  $content	操作说明
			*/
			$this -> write_log(2,$com_id,"商品[".$com_id."]增加库存".$data['stock']."件 剩余库存".$final['stock']."件");
			return 1;
		}else
		{
			return 0;
		}
	}
	
	
	
	
	
	
}
